﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

//翻译由编译与链接两部分组成

//编译由预编译，编译，汇编组成

//编译：/每个.c文件通过编译器生成对应的.obj文件

//链接：所有的.obj文件与链接库（库函数）一起通过链接器生成.exe程序

//预编译：
//1.头文件的包含
//2.#define定义符号的替换和删除
//3.注释的删除
//...等预处理指令

//编译：
//将c语言代码翻译成汇编代码

//汇编：
//1.将汇编代码翻译成二进制指令
//2.形成符号表

//链接
//1.合并段表
//2.符号表的合并和符号表的重定位

//预处理详解：

//1.预定义符号
//预定义阶段将预定义符号替换成对应的信息
int main()
{
	printf("%s\n", __FILE__);//D:\CODE_gitee\2025_02\2025_02_04\2025_02_04\test.c文件名
	printf("%d\n", __LINE__);//此行代码的行数
	printf("%s\n", __DATE__);//编译日期
	printf("%s\n", __TIME__);//编译时间
	printf("%s\n", __FUNCTION__);//此行代码所处的函数的函数名
	//printf("%s\n", __STDC__);
	//如果编译器遵循ANSI C，其值为1，否则未定义
	return 0;
}


//#define:

//1.#define定义标识符

#define CASE break;case//在写case语句的时候自动把break写上。

int main()
{
	int n = 0;
	switch (n)
	{
	case 1:
	CASE 2:
	CASE 3:
	CASE 4:
	}
	return 0;
}

// 如果定义的 stuff过长，可以分成几行写，除了最后一行外，每行的后面都加一个反斜杠(续行符)。
#define DEBUG_PRINT printf("file:%s\tline:%d\t \
                          date:%s\ttime:%s\n" , \
                         __FILE__,__LINE__ , \
                          __DATE__,__TIME__ ) 

//2. #define 定义宏

//#define name( parament-list ) stuff
//其中的 parament - list 是一个由逗号隔开的符号表，它们可能出现在stuff中

//参数列表的左括号必须与name紧邻。
//如果两者之间有任何空白存在，参数列表就会被解释为stuff的一部分

#define SQUARE(x) （(x)*(x)）
#define MAX(x,y) ((x)>(y)?(x):(y))
//写宏的时候不加括号可能会出问题（优先级方面）
int main()
{
	//printf("%d\n", SQUARE(5));//5*5
	//printf("%f\n", SQUARE(2.5));//2.5*2.5
	printf("%d\n", MAX(5, 3));//5
	return 0;
}

#define PRINT(x) printf("the value of x is %d\n",x)
//预处理器搜索#define定义的符号的时候，字符串常量的内容并不被搜索
int main()
{
	int a = 10;
	PRINT(a);//the value of x is 10
	int b = 20;
	PRINT(b);//the value of x is 20
	return 0;
}

#define PRINT(format, x) printf("the value of "#x" is "format"\n",x)//多个字符串合并一起
//#a --> "a"，把一个宏参数变成对应的字符串
int main()
{
	int a = 10;
	PRINT("%d", a);//the value of a is 10
	int b = 20;
	PRINT("%d", b);//the value of b is 20
	float f = 3.14f;
	PRINT("%f", f);//the value of f is 3.140000
	printf("the value of ""%d"" is c", 30);//编译过程中会把the value of ，%d， is c这三个字符串合并，再执行printf语句
	return 0;
}

//想要让#define定义字符串中常量中的内容有两个方法
//1.#参数=="参数"
//2.将字符串放在参数那里，传递过去

#define CAT(x,y) x##y

int main()
{
	int class109 = 2025;
	printf("%d\n", CAT(class, 109));
	//##可以把位于它两边的符号合成一个符号
}